# -*- coding: utf-8 -*-
"""
用户模块 - 数据模型定义

本文件定义了测试DEMO中用户相关的所有数据模型，包括：

1. User - 扩展用户模型
   - 继承Django的AbstractUser，扩展用户基本信息
   - 添加手机号、真实姓名、身份证号等个人信息
   - 集成风险等级评估结果
   - 记录用户的总资产和可用现金
   - 跟踪用户的投资经验年限
   - 支持用户资产和风险偏好管理

2. RiskAssessment - 风险评估模型
   - 记录用户的风险评估详细结果
   - 包含年龄、收入、经验、目标等维度评分
   - 计算总分并确定风险等级
   - 按评估时间排序，支持历史评估查询
   - 为投资建议提供风险偏好依据

常量定义：
- RISK_LEVELS: 风险等级选项（保守型到激进型的5个等级）

风险等级说明：
- 保守型(1): 追求资本保值，风险承受能力低
- 稳健型(2): 追求稳定收益，适度承担风险
- 平衡型(3): 平衡收益与风险，中等风险承受能力
- 成长型(4): 追求较高收益，能承担较高风险
- 激进型(5): 追求高收益，风险承受能力强

这些模型为系统提供了完整的用户画像和风险评估体系，
支持个性化的投资建议和产品推荐。

Author: zhaozeliang
Date: 2025-01-14
"""

from django.db import models
from django.contrib.auth.models import AbstractUser
from decimal import Decimal

# 风险等级选择
RISK_LEVELS = [
    (1, '保守型'),
    (2, '稳健型'),
    (3, '平衡型'),
    (4, '成长型'),
    (5, '激进型'),
]

class User(AbstractUser):
    """扩展用户模型"""
    phone = models.CharField(max_length=11, unique=True, null=True, blank=True, verbose_name='手机号')
    real_name = models.CharField(max_length=50, null=True, blank=True, verbose_name='真实姓名')
    id_card = models.CharField(max_length=18, null=True, blank=True, verbose_name='身份证号')
    risk_level = models.IntegerField(choices=RISK_LEVELS, default=1, verbose_name='风险等级')
    total_assets = models.DecimalField(max_digits=15, decimal_places=2, default=Decimal('0'), verbose_name='总资产')
    available_cash = models.DecimalField(max_digits=15, decimal_places=2, default=Decimal('0'), verbose_name='可用现金')
    investment_experience = models.IntegerField(default=0, verbose_name='投资经验(年)')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    
    class Meta:
        verbose_name = '用户'
        verbose_name_plural = '用户'
        db_table = 'users'
    
    def __str__(self):
        return f'{self.username} - {self.real_name}'

class RiskAssessment(models.Model):
    """风险评估模型"""
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='用户')
    age_score = models.IntegerField(verbose_name='年龄评分')
    income_score = models.IntegerField(verbose_name='收入评分')
    experience_score = models.IntegerField(verbose_name='经验评分')
    goal_score = models.IntegerField(verbose_name='目标评分')
    total_score = models.IntegerField(verbose_name='总分')
    risk_level = models.IntegerField(choices=RISK_LEVELS, verbose_name='风险等级')
    assessment_date = models.DateTimeField(auto_now_add=True, verbose_name='评估时间')
    
    class Meta:
        verbose_name = '风险评估'
        verbose_name_plural = '风险评估'
        db_table = 'risk_assessments'
        ordering = ['-assessment_date']
    
    def __str__(self):
        return f'{self.user.real_name} - {self.get_risk_level_display()}'
